import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Scanner;


public class launcher {
	
	static int coordenadaUMTfinalX;
	static int coordenadaUMTfinalY;
	
	public static void main(String[] args) throws IOException {
	    String sFichero = "Mapa_Global.h5";
	    File fichero = new File(sFichero);
	    ArrayList<Hoja> hojas= new ArrayList<Hoja>();
	    Scanner sc = new Scanner(System.in);
	    
	    // Si el fichero no existe...
	    if (!fichero.exists()){ 
	    	// Leeemos los ficheros .asc
	    	Hoja hoja1= UTIL.Init("MDT25-0711-H30.asc");
			Hoja hoja2= UTIL.Init("MDT25-0712-H30.asc");
			Hoja hoja3= UTIL.Init("MDT25-0736-H30.asc");
			Hoja hoja4= UTIL.Init("MDT25-0737-H30.asc");
			
	        hojas.add(hoja1);
	        hojas.add(hoja2);
	        hojas.add(hoja3);
	        hojas.add(hoja4);
	        
	 
			// Creamos la jerarquia.
			UTIL.CreateHDF5();
			
			// Escribimos cada hoja en un dataset dentro del fichero .h5
			for(int i=0;i<hojas.size();i++)
				UTIL.ReadWriteDataset(hojas.get(i));
	    }
	    
	  //ContenedorNodos.ordenarNodos(new Nodo(0, null, einicial, 0, 0, 0, 0));

	    //Menu de seleccion de ruta
	  		
	   System.out.println("Inserte la coordenada X UMT del lugar inicial:");
	    int coordenadaUMTinicialX=sc.nextInt();			//397388;
	    System.out.println("Inserte la coordenada Y UMT del lugar inicial:");
	    int coordenadaUMTinicialY=sc.nextInt();			//4353788;
	  		
	    System.out.println("Inserte la coordenada X UMT del lugar destino:");
	    coordenadaUMTfinalX=sc.nextInt();		//399690;
	    System.out.println("Inserte la coordenada Y UMT del lugar destino:");
	    coordenadaUMTfinalY=sc.nextInt();		//4360861;
	    
	    System.out.println("Inserte la estrategia de busqueda:");
	    String estrategia=sc.next();		//profundidad, anchura, uniforme, voraz, A;
	    
	    System.out.println("Inserte la profundidad maxima:");
	    int profundidad=sc.nextInt();
	    boolean error= false;
		if (!estrategia.equals("profundidad") && !estrategia.equals("anchura") && !estrategia.equals("voraz") &&  !estrategia.equals("A") && !estrategia.equals("uniforme")){
			error= true;
		}
	   
		Estado einicial= Problema.estadoInicial(coordenadaUMTinicialX  , coordenadaUMTinicialY);
	    Estado efinal= Problema.estadoInicial(coordenadaUMTfinalX , coordenadaUMTfinalY);
	    
	    
	   
	    Nodo nodo_actual = null;
	    
	    long time_start= 0, time_end= 0;
	    if((einicial!=null && efinal!=null) && !error){	
	    	time_start = System.currentTimeMillis();
	    	nodo_actual = EstrategiasDeBusqueda.busqueda(einicial, efinal, estrategia, profundidad);
	    	time_end = System.currentTimeMillis();
	    }else{
	    	error= true;
	    }
	    
	    generarInforme(nodo_actual, time_end-time_start, error);
	    
	    UTIL.CerrarHDF5();
	    
	}
	
	//Informe por fichero
	@SuppressWarnings("unused")
	public static void generarInforme(Nodo nodo_actual, long tiempo, boolean error) throws IOException{
		FileWriter fichero = new FileWriter("informe.txt");
		PrintWriter pw = new PrintWriter(fichero);
		
		if (error){
			pw.println("Error en la introduccion de parametros");
		}else{
			if(nodo_actual != null){
				pw.println("Costo total del camino: " + nodo_actual.getCosto() + " | Profundidad: " + nodo_actual.getProfundidad() + " | Tiempo de ejecucion: " + tiempo/1000.0 +" segundos");
				pw.println(nodo_actual.toString());	//Lugar Geografico y altitud de cada nodo
			}				
			else{
				pw.println("Costo total del camino: 0"  + " | Profundidad: 0" + " | Tiempo de ejecucion: " + tiempo/1000.0 +" segundos");
				pw.println("Solucion no encontrada");	//Lugar Geografico y altitud de cada nodo
			}
				
		}
		
		fichero.close();
	}
}
